#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>

using namespace std;

/**
 *  解决大数据量的办法   建立学号和索引  对学号进行排序 然后找到对应的索引
 * @return
 */
typedef struct {
    char name[10];
    int num;
    int age;
    char sex;
} Student;

student stu[5] = {
        {"Li",    1001, 11, 'M'},
        {"Zhang", 1002, 13, 'F'},
        {"Wang",  1003, 15, 'M'},
        {"Zhao",  1004, 16, 'F'},
        {"Liu",   1005, 13, 'M'}
};
const int maxNum = 100; //假设的学生数量

int main() {
    //转换现有数据格式
    //1.读入ASCII文件
    ifstream iofile("ask.txt", ios::in | ios::out);
    int stuNum = 0; //记录学生的人数
    Student students[100]; //假设文件中的数据小于100个
    while (!iofile.end()) {
        iofile >> students[stuNum].name;
        iofile >> students[stuNum].num;
        iofile >> students[stuNum].age;
        iofile >> students[stuNum].sex;
        stuNum++;
    }
    iofile.close();
    //2.写入到二进制文件
    ofstream outputfile("binary.txt", ios::out | ios::binary);
    outputfile.write((char *) &stuNum, sizeof(stuNum)); //首先把总人数写入到文件中
    for (int i = 0; i < stuNum; ++i) {
        outputfile.write((char *) &students[i], sizeof(students[i]));
    }
    outputfile.close();

    //binary.txt就保存了二进制的数据  再就可以对二进制操作

    //1、读入数据
    int stuNum = 0;
    Student *students;
    //首先读取二进制文件的第一位  表示的总人数
    fstream binaryFile("binary.txt", ios::in | ios::binary);
    //读入人数
    binaryFile.read((char *) &stuNum, sizeof(stuNum));
    students = new Student[stuNum];
    //读入数据
    for (int i = 0; i < stuNum; ++i) {
        iofile.read((char *) &students[i], sizeof(students[i]));
    }
    //2、完成业务  可以增删改查

    //3、保存数据
    binaryFile.seekg(0, ios::beg);
    binaryFile.write((char *) &stuNum, sizeof((stuNum)));//对业务操作后，重新改变总人数
    for (int i = 0; i < stuNum; ++i) {
        binaryFile.write((char *) &students[i], sizeof(Student));
    }
    binaryFile.close();

    return 0;
}
